<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 设计原则：
    *
    *   1.单一职责原则
    *       一个程序只做好一件事
    *       如果功能过于的复杂就拆分开，每个部分保持独立。
    *
    *   2.开放封闭原则（这个原则非常难做到）
    *       对扩展开放，对修改封闭
    *       增加需求时，扩展新代码，而非修改已有代码
    * （剩下不常用）
    *   3.李氏置换原则
    *       引用基类（父类）的地方必须能透明地使用其子类的对象（透明就是父类中的加法方法，在子类中想都不用想依旧是加法，不会是加法变其他方法）
    *       子类可以扩展父类功能，但不能改变父类原有功能（可以覆盖但不能改变）
    *       js使用较少，弱类型语言以及继承使用少
    *
    *   4.接口独立原则
    *       接口保持单一独立，避免出现"胖接口"，建立单一的接口，同时接口中的方法要尽量的少。使用的接口，必须要实现100种方法。
    *       js没有接口（ts除外），使用较少
    *       类似单一职责原则（业务逻辑），这里更加关注接口（方法数量）
    *
    *   5.依赖倒置原则
    *       面向接口编程，依赖于抽象而不依赖于具体
    *       高层模块不应该依赖低层模块，二者都应该依赖其抽象。抽象不应该依赖细节，细节应该依赖抽象
    *       js使用较少（没有接口，弱类型）
    *
    * */

    //单一职责
    class animal{

    }
    class bird extends animal{ //鸟类只做鸟类的事
        fly(){

        }
    }
    class fish extends animal{ //鱼类只做鱼类的事
        swim(){

        }
    }

    //es5写开放封闭原则
    //这里就对修改封闭
    var makeSound = function (animal){
        //很多很多代码。。。
        animal.sound()
    }

    //下面就是对扩展开放，增加一个动物就增加一种叫声，不用修改原来已有代码
    var Pig = function (){

    }
    Pig.prototype.sound = function (){
        console.log("lululu")
    }

    var Dog = function (){

    }
    Dog.prototype.sound = function (){
        console.log("wangwangwang")
    }

    var Duck = function (){

    }
    Duck.prototype.sound = function (){
        console.log("gagaga")
    }

    //执行时只要添加进去就可以
    makeSound(new Duck())
    makeSound(new Pig())
    makeSound(new Dog())

    //李氏置换原则
    class Parent{
        constructor(a,b){
            this.a = a
            this.b = b
        }
        add(){ //父类里面有加法
            console.log(this.a + this.b)
        }
    }

    class Child extends Parent{
        constructor(a,b) {
            super(a,b);
        }
        add(){ //子类不能修改父类原有的加法使其变成乘法或者减法之类
            console.log(this.a + this.b)
        }
        min(){ //但可以扩展父类没有的方法
            console.log(this.a - thia.b)
        }
    }
</script>
</body>
</html>